package com.gl.glcourses.managers
{
	import com.gl.glcourses.events.GLCoursesEvent;
	import com.gl.glcourses.model.PresentationModel;
	import com.gl.glcourses.model.constants.Constants;
	import com.gl.glcourses.vos.*;
	
	import flash.net.URLRequest;
	import flash.net.navigateToURL;
	
	import mx.collections.ArrayCollection;
	import mx.controls.Alert;
	import mx.core.FlexGlobals;
	import mx.managers.CursorManager;
	import mx.resources.ResourceManager;
	
	public class GLCoursesManager extends PresentationModel
	{		
		
		[Bindable]
		public var votacionMail:Votacion = new Votacion();
		[Bindable]
		public var edicionCursoMail:EdicionCurso = new EdicionCurso();
		
		//Listado de estadisticas
		[Bindable]
		public var listStaticHorasOficina:ArrayCollection  = new ArrayCollection();
		
		[Bindable]
		public var listStaticTopTenCursos:ArrayCollection  = new ArrayCollection();
		

		// Banderas de los idiomas
		[Embed(source="assets/flags/es_ES.png")]
		[Bindable]
		public var es_AR:Class;
		
		[Embed(source="assets/flags/en_US.png")]
		[Bindable]
		public var en_US:Class;

		[Bindable]
		public var locales:ArrayCollection = new ArrayCollection( [ {label:'Español', id:'es_ES', icon:es_AR} , 
																	{label:'English', id:'en_US', icon:en_US} ] );
		
		// TAB DE HEADER 
		[Bindable]
		public var tabCursosState:String;
		[Bindable]
		public var tabVotacionesState:String;
		[Bindable]
		public var tabAgendasState:String;
		[Bindable]
		public var tabMisCursosState:String;
		[Bindable]
		public var tabInscripcionState:String;
		[Bindable]
		public var tabConfiguracionesState:String;
		
		/* LISTADO DE OFICINAS */
		[Bindable]
		public var tabSeleccionado:int;
		[Bindable]
		public var votosUsuarioLogeado:ArrayCollection  = new ArrayCollection();
		
		[Bindable]
		public var listFeedBack:ArrayCollection  = new ArrayCollection();
		
		[Bindable]
		public var listFeedBackEdicionCursoSeleccionada:ArrayCollection  = new ArrayCollection();
		
		[Bindable]
		public var votacion:Votacion = new Votacion();
		
		[Bindable]
		public var votacionCurso:VotacionCurso = new VotacionCurso();
		
		[Bindable]
		public var oficinas:ArrayCollection = new ArrayCollection();
		
		[Bindable]
		public var cursos:ArrayCollection = new ArrayCollection();
		
		[Bindable]
		public var cursosAgendados:ArrayCollection = new ArrayCollection();
		
		[Bindable]
		public var userName:String;
		
		[Bindable]
		public var cursoNuevo:Curso = new Curso();
		
		[Bindable]
		public var cursoSeleccionado:Curso = new Curso();
		
		[Bindable]
		public var cursoSeleccionadoAccion:String;
		
		[Bindable]
		public var materialesAdjuntos:ArrayCollection  = new ArrayCollection();
		
		[Bindable] 
		public var materialAdjuntoNuevo:MaterialAdjunto = new MaterialAdjunto();

		[Bindable]
		public var applicationState:String;
		
		[Bindable]
		public var loginState:String;
		
		[Bindable]
		public var perfiles:ArrayCollection=new ArrayCollection();
	
		[Bindable]
		public var tiposCurso:ArrayCollection  = new ArrayCollection();
		
		[Bindable]
		public var votaciones:ArrayCollection  = new ArrayCollection();
		
		[Bindable]
		public var votacionesAbiertas:ArrayCollection = new ArrayCollection();
		
		[Bindable]
		public var votacionesDisponibles:ArrayCollection = new ArrayCollection();
				
		[Bindable]
		public var votosVotacion:ArrayCollection  = new ArrayCollection();
		
		[Bindable] 
		public var usuarioSeleccionado:Usuario = new Usuario();
		
		[Bindable] 
		public var usuarioLogeado:Usuario = new Usuario();
		
		[Bindable] 
		public var edicionesCursos:ArrayCollection = new ArrayCollection();

		[Bindable] 
		public var usuariosPM:ArrayCollection = new ArrayCollection();
		
		[Bindable] 
		public var usuariosSinOficina:ArrayCollection = new ArrayCollection();
		
		[Bindable] 
		public var lugares:ArrayCollection  = new ArrayCollection();		

		[Bindable]
		public var usuarios:ArrayCollection  = new ArrayCollection();
		
		[Bindable]
		public var participantes:ArrayCollection = new ArrayCollection();
		
		[Bindable] 
		public var edicionCursoSeleccionado:EdicionCurso = new EdicionCurso();

		[Bindable]
		public var desktopState:String;	
		
		[Bindable]
		public var edicionesCursosAsistidos:ArrayCollection  = new ArrayCollection();
		
		[Bindable]
		public var edicionesCursosAprobados:ArrayCollection  = new ArrayCollection();
		
		[Bindable]
		public var calendarios:ArrayCollection  = new ArrayCollection();
		
		[Bindable]
		public var confirmacionVotacion:Confirmacion = new Confirmacion();
		
		
		[Bindable]
		public var votosVotacionesCurso:ArrayCollection;
		
		
		//Al listar las estadisticas redondeamos
		//los numeros decimales
		public function setListStaticHorasOficina(value:ArrayCollection):void
		{			
			var str:String;
			for each(var staticHorasOficina:StaticHorasOficina in value)
			{
				str = staticHorasOficina.cantHoras.toFixed(1);
				staticHorasOficina.cantHoras = Number(str);
			}
			listStaticHorasOficina = value;
		}
		
		public function setListStaticTopTenCursos(value:ArrayCollection):void
		{
			this.listStaticTopTenCursos = value;
		}
			
		public function setCalendarios(value:ArrayCollection):void
		{			
			calendarios = value;
			
			this.tabSeleccionado = Constants.TAB_CONFIGURACION;
			this.tabConfiguracionesState = Constants.ESTADO_CALENDARIO_OFICINA;
			
			this.loadComplete();
		}
		
		
		public function setLocales(value:ArrayCollection):void
		{
			locales = value;
		}
		
		public function setApplicationState( state:String ):void
		{
			applicationState = state;	
		}
		
		public function setOficinas( value:ArrayCollection ):void
		{
			oficinas = value;
		}
		
		public function setListFeedBack( value:ArrayCollection ):void
		{
			listFeedBack = value;
		}
		
		public function setVotosUsuarioLogeado( value:ArrayCollection ):void
		{
			votosUsuarioLogeado = value;
		}
		public function setCursos( value:ArrayCollection ):void
		{
			var cursosOrdenados:Array = value.source;	
			cursosOrdenados.sortOn("nombre");
			cursos = new ArrayCollection(cursosOrdenados);		
		}
		public function setmaterialesAdjuntos( value:ArrayCollection ):void
		{
			materialesAdjuntos = value;
		}
		
		
		public function setVotaciones( value:ArrayCollection ):void
		{
			votaciones = value;
			
			var date:Date = new Date();
			date.setDate();

			for each(var votacion:Votacion in this.votaciones)
			{
				for each(var usuario:Usuario in votacion.usuarios)
				{
					if(usuario.nombre == this.usuarioLogeado.nombre)
					{
						votacionesDisponibles.addItem(votacion);
					}
				}
				//Separamos las votaciones abiertas
				if(votacion.fechaCierre.time > date.time)
				{
					votacionesAbiertas.addItem(votacion);
				}
			}
		}
		
		public function setUsuarios( value:ArrayCollection ):void
		{
			var usuariosOrdenados:Array = value.source;	
			usuariosOrdenados.sortOn("nombre");
			value = new ArrayCollection(usuariosOrdenados);
			
			usuarios = value;
			
			this.usuariosPM.refresh();
			var usuariosPMTemp:ArrayCollection = new ArrayCollection();
			usuariosPMTemp.addAll( usuarios );
			usuariosPMTemp.filterFunction = usuariosPMfilterFunction;
			usuariosPMTemp.refresh();

			this.usuariosPM = usuariosPMTemp;
			
			if(this.usuarioLogeado.tipoUsuario == TipoUsuario.ADMINISTRADOR)
			{
				for each(var usuarioSinOficina:Usuario in this.usuarios)
				{
					if(!usuarioSinOficina.oficina)
					{
						this.usuariosSinOficina.addItem(usuarioSinOficina);
					}
				}
			}
		
		}
		
		private function usuariosPMfilterFunction( item:Object ):Boolean
		{
			if( !item || !( item is Usuario )  )
				return false;
			
			if((item as Usuario).rol=="PM")
			{
				return true;
			}
			return false;
		}
		
		public function setVotacionId( value:int ):void
		{
			for each(var votacion:Votacion in this.votacionesAbiertas)
			{
				if(votacion.id == value)
				{
					this.votacionMail = votacion;
				}
			}
		}
		public function setEdicionCursoId( value:int ):void
		{
			for each(var edicionCurso:EdicionCurso in this.edicionesCursosAsistidos)
			{
				if(edicionCurso.id == value)
				{
					this.edicionCursoMail = edicionCurso;
				}
			}
		}
		
		public function setLoginState( state:String ):void
		{
			loginState = state;	
		}
		
		public function setVotosVotacion( value:ArrayCollection ):void
		{
			votosVotacion = value;	
		}
		
		
		//Cambiar tab del header
		public function setTabSeleccionado( index:int ):void
		{
			tabSeleccionado = index;	
			
			switch(index){
				
				//TAB CURSOS
				case Constants.TAB_CURSOS:
					this.tabCursosState = Constants.ESTADO_VER_CURSOS;
					break;
				
				//TAB AGENDAS
				case Constants.TAB_AGENDAS:
					this.tabAgendasState = Constants.ESTADO_VER_AGENDAS;
					break;
				
				//TAB VOTACIONES SEGUN ROL
				case Constants.TAB_VOTACIONES:
					if(usuarioLogeado.rol == Constants.USUARIO_ADMINISTRADOR)
					{
						this.tabVotacionesState = Constants.ESTADO_REVISAR_VOTACION;
						break;		
					}
					if(usuarioLogeado.rol == Constants.USUARIO_PM)
					{
						this.tabVotacionesState = Constants.ESTADO_VOTAR;
						break;
					}
				
				//TAB INSCRIPCIONES
				case Constants.TAB_INSCRIPCIONES_ACTUALES:
					this.tabInscripcionState = Constants.ESTADO_VER_MIS_INCRIPCIONES;
					break;
				
				//TAB CONFIGURACION
				case Constants.TAB_CONFIGURACION:
					this.tabConfiguracionesState = Constants.ESTADO_TIPOSDECURSOS_PERFILES;
					break;
			}
		}
		
		public function setTabCursosState( state:String ):void
		{
			tabCursosState = state;	
		}
		
		public function setTabVotacionesState( state:String ):void
		{
			tabVotacionesState = state;	
		}
		
		public function setTabAgendasState( state:String ):void
		{
			tabAgendasState = state;	
		}
		
		public function setTabMisCursosState( state:String ):void
		{
			tabMisCursosState = state;	
		}
		
		public function setTabInscripcionState( state:String ):void
		{
			tabInscripcionState = state;	
		}
		
		public function setTabConfiguracionesState( state:String ):void
		{
			tabConfiguracionesState = state;	
		}
		
		public function iniciarSesion( usuarioLogeado:Usuario,recordarUsuario:Boolean, contrasenia:String):void
		{
			
			this.usuarioLogeado=usuarioLogeado;
			var eventLogin:GLCoursesEvent;		
			
			//INICIO ADMINISTRADOR
			if( usuarioLogeado.rol == Constants.USUARIO_ADMINISTRADOR )
			{
				eventLogin = new GLCoursesEvent( GLCoursesEvent.INICIO_ADMIN );
				eventLogin.usuarioLogeado = usuarioLogeado;
				dispatch(eventLogin);
				
				tabSeleccionado = Constants.TAB_CURSOS;
				tabCursosState=Constants.ESTADO_VER_CURSOS;
				desktopState = Constants.USUARIO_ADMINISTRADOR;	
			} 	
			
			//INICIARIO USUARIO
			else if ( usuarioLogeado.rol == Constants.USUARIO_USUARIO )
			{
				eventLogin = new GLCoursesEvent( GLCoursesEvent.INICIO_USUARIO );
				eventLogin.usuarioLogeado = this.usuarioLogeado;
				dispatch(eventLogin);
				
				tabSeleccionado = Constants.TAB_MIS_CURSOS;
				tabMisCursosState= Constants.ESTADO_VER_MIS_CURSOS;
				desktopState = Constants.USUARIO_USUARIO;
				
			} 
			
			//INICIO PM
			else if (usuarioLogeado.rol == Constants.USUARIO_PM )
			{
				eventLogin  = new GLCoursesEvent( GLCoursesEvent.INICIO_PM );
				eventLogin.usuarioLogeado = this.usuarioLogeado;
				dispatch(eventLogin);
				
				tabSeleccionado = Constants.TAB_VOTACIONES;
				desktopState = Constants.USUARIO_PM;
				tabVotacionesState = Constants.ESTADO_VOTAR;
			} 				

			
			//RECORDAR USUARIO O BORRAR USUARIO RECORDADO
			if( recordarUsuario==true )
			{ 	
				eventLogin = new GLCoursesEvent( GLCoursesEvent.RECORDAR_USUARIO );
				eventLogin.nombreLogin = usuarioLogeado.nombre;
				eventLogin.contraseniaLogin = contrasenia;
			} else {
				eventLogin = new GLCoursesEvent( GLCoursesEvent.BORRAR_RECORDAR_USUARIO );
				eventLogin.nombreLogin = usuarioLogeado.nombre;
			}
			dispatch( eventLogin );
			
			//PANTALLA PRINCIPAL DE APLICACION
			this.setLoginState(Constants.STATE_LOGGED);
			loadComplete();
		}
		
		public function setCursoNuevo( curso:Curso):void
		{
			cursoNuevo = curso;	
		}	

		public function setmaterialAdjuntoNuevo( materialAdjunto:MaterialAdjunto):void
		{
			materialAdjuntoNuevo = materialAdjunto;	
		}
	
		public function setCursoSeleccionado( cursoObtenido:Curso):void
		{
			cursoSeleccionado = cursoObtenido;	
		}		

		public function setEdicionesCursos(value:ArrayCollection):void
		{
			edicionesCursos = value;
			
			if(  FlexGlobals.topLevelApplication.parameters.estado )
			{
				if( FlexGlobals.topLevelApplication.parameters.edicionCursoId )
				{   
					for each( var currentEdicionCurso:EdicionCurso in value )
					{
						if( currentEdicionCurso.id.toString() == FlexGlobals.topLevelApplication.parameters.edicionCursoId )
						{
							edicionCursoSeleccionado = currentEdicionCurso;
						}
					}
				}				

			}
			
		}
		
		public function setCursosAgendados(value:ArrayCollection):void
		{
			cursosAgendados = value;
		}
		
		public function setEdicionesCursosAsistidos(value:ArrayCollection):void
		{
			edicionesCursosAsistidos = value;
		}
		
		public function setLugares( value:ArrayCollection ):void
		{
			var lugaresOrdenados:Array = value.source;	
			lugaresOrdenados.sortOn("descripcion");
			lugares = new ArrayCollection(lugaresOrdenados);
		}
		
		public function setTiposCurso( value:ArrayCollection ):void
		{
			var tiposCursoOrdenados:Array = value.source;	
			tiposCursoOrdenados.sortOn("nombre");
			tiposCurso = new ArrayCollection(tiposCursoOrdenados);
		}
		
		public function setPerfiles( value:ArrayCollection ):void
		{
			var perfilesOrdenados:Array = value.source;	
			perfilesOrdenados.sortOn("nombre");
			perfiles = new ArrayCollection(perfilesOrdenados);
		}
	
		
		public function setParticipantes( value:ArrayCollection ):void
		{
			participantes = value;
		}
		
		public function setEdicionCursoSeleccionado( value:EdicionCurso):void
		{
			edicionCursoSeleccionado = value;
			
		}		
		
		public function setEdicionesCursosAprobados( value:ArrayCollection):void
		{
			edicionesCursosAprobados = value;
		}

		//chicos esta es la confirmacion que deberian usar todos
		public function setConfirmacionReal( confirmacion:Confirmacion, mensajeOk:String, mensajeError:String ):void {
			loadComplete();
			if( confirmacion.estado == Constants.CONFIRMACION_ERROR )
			{ // ese error string deberia internalizarse
				Alert.show(ResourceManager.getInstance().getString("resources", confirmacion.errorString), 
					Constants.getString( mensajeError )  );
			} else {
				Alert.show( Constants.getString( mensajeOk ),'Confirmation'); //intarnalizar cnfirmacion  
			}		
		}				
	
       public function setConfirmacion( confirmacion:Confirmacion):void {
			if( confirmacion.estado  == Constants.CONFIRMACION_OK ) { 
				Alert.show("La operacion se realizo con exito");
				// -.-
			} else {
				Alert.show(ResourceManager.getInstance().getString("resources", confirmacion.errorString),"Error");					
			}
		}
		
		//Salir de la aplicacion
		public function cerrarSesion():void
		{
			var url :URLRequest = new URLRequest("/glcourses/Main.html");
			navigateToURL(url, "_self")
		}
				

		public function setPresentismoEdicionCurso( value:ArrayCollection ):void
		{
			for each( var participante:Participante in edicionCursoSeleccionado.participantes )
			{
				participante.estadoPresentismo.removeAll();
				
				for each( var presentismo:PresentismoSesionEdicionCurso in value )
				{
					if( participante.id == presentismo.participante.id )
					{
						participante.estadoPresentismo.addItem( presentismo );
						
					}
					
				}
			}
		}
		
		public function setRevisarFeedBackPanel(value:EdicionCurso):void
		{
			this.listFeedBackEdicionCursoSeleccionada = new ArrayCollection();
			this.edicionCursoSeleccionado = value as EdicionCurso;
			for each(var feedback:Feedback in this.listFeedBack)
			{
				for each(var participante:Participante in this.edicionCursoSeleccionado.participantes)
				{
					if(feedback.participante.id == participante.id)
					{
						this.listFeedBackEdicionCursoSeleccionada.addItem(feedback);
					}
				}
			}
			this.setTabAgendasState(Constants.ESTADO_VER_FEEDBACK);
		}
		
		//Quitar el reloj del cursor
		private function loadComplete():void
		{
			CursorManager.removeBusyCursor();
		}
		
}
}